package main

import (
	"fmt"
)

/**
给定一个含有 n 个正整数的数组和一个正整数 s ，找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组，返回 0。

示例:

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

解析
	滑动窗口
	i,j最大都执行n次 所以时间复杂度是2O(n),也就是O(n)

*/

func main() {
	fmt.Println(minSubArrayLen(7, []int{2, 3, 1, 2, 4, 3}))
}

const MAXINT = 1<<31 - 1

func minSubArrayLen(target int, nums []int) int {
	i, j := 0, 0
	sum := 0
	minLen := MAXINT
	for ; j < len(nums); j++ {
		sum += nums[j]
		for sum >= target {
			minLen = min(j-i+1, minLen)
			sum -= nums[i]
			i++
		}
	}

	if minLen == MAXINT {
		return 0
	}
	return minLen
}

func min(a, b int) int {
	if a > b {
		return b
	} else {
		return a
	}
}
